Latviešu

Visaptveroša rokasgrāmata par Next.js 14 Servera Darbībām, aptverot formu apstrādes labākās prakses, datu validāciju, drošības apsvērumus un progresīvas metodes mūsdienīgu tīmekļa lietotņu izveidei.

Next.js 14 Servera Darbības: Formu apstrādes labākās prakses apgūšana

Next.js 14 ievieš jaudīgas funkcijas, lai veidotu veiktspējīgas un lietotājam draudzīgas tīmekļa lietotnes. Starp tām Servera Darbības (Server Actions) izceļas kā transformējošs veids, kā apstrādāt formu iesniegšanu un datu mutācijas tieši serverī. Šī rokasgrāmata sniedz visaptverošu pārskatu par Servera Darbībām Next.js 14, koncentrējoties uz labākajām praksēm formu apstrādē, datu validācijā, drošībā un progresīvām tehnikām. Mēs izpētīsim praktiskus piemērus un sniegsim noderīgus ieskatus, lai palīdzētu jums veidot robustas un mērogojamas tīmekļa lietotnes.

Kas ir Next.js Servera Darbības?

Servera Darbības ir asinhronas funkcijas, kas darbojas serverī un var tikt izsauktas tieši no React komponentēm. Tās novērš nepieciešamību pēc tradicionāliem API maršrutiem formu iesniegšanas un datu mutāciju apstrādei, tādējādi vienkāršojot kodu, uzlabojot drošību un veiktspēju. Servera Darbības ir React Servera Komponentes (RSCs), kas nozīmē, ka tās tiek izpildītas serverī, nodrošinot ātrāku sākotnējo lapas ielādi un uzlabotu SEO.

Galvenās Servera Darbību priekšrocības:

Sava Next.js 14 projekta iestatīšana

Pirms iedziļināties Servera Darbībās, pārliecinieties, ka jums ir iestatīts Next.js 14 projekts. Ja sākat no nulles, izveidojiet jaunu projektu, izmantojot šādu komandu:

npx create-next-app@latest my-next-app

Pārliecinieties, ka jūsu projekts izmanto app direktoriju struktūru, lai pilnībā izmantotu Servera Komponentes un Darbības.

Pamata formu apstrāde ar Servera Darbībām

Sāksim ar vienkāršu piemēru: forma, kas iesniedz datus, lai izveidotu jaunu vienumu datu bāzē. Mēs izmantosim vienkāršu formu ar ievades lauku un iesniegšanas pogu.

Piemērs: Jauna vienuma izveide

Vispirms definējiet Servera Darbības funkciju savā React komponentē. Šī funkcija apstrādās formas iesniegšanas loģiku serverī.

// app/components/CreateItemForm.tsx
'use client';

import { useState } from 'react';

async function createItem(formData: FormData) {
  'use server'

  const name = formData.get('name') as string;

  // Simulēt datu bāzes mijiedarbību
  console.log('Veido vienumu:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simulēt latentumu

  console.log('Vienums veiksmīgi izveidots!');
}

export default function CreateItemForm() {
  const [isSubmitting, setIsSubmitting] = useState(false);
  
  async function handleSubmit(formData: FormData) {
    setIsSubmitting(true);
    await createItem(formData);
    setIsSubmitting(false);
  }

  return (
    
); }

Paskaidrojums:

Datu Validācija

Datu validācija ir izšķiroša, lai nodrošinātu datu integritāti un novērstu drošības ievainojamības. Servera Darbības sniedz lielisku iespēju veikt servera puses validāciju. Šī pieeja palīdz mazināt riskus, kas saistīti tikai ar klienta puses validāciju.

Piemērs: Ievades datu validēšana

Modificējiet Servera Darbību createItem, lai iekļautu validācijas loģiku.

// app/components/CreateItemForm.tsx
'use client';

import { useState } from 'react';

async function createItem(formData: FormData) {
  'use server'

  const name = formData.get('name') as string;

  if (!name || name.length < 3) {
    throw new Error('Vienuma nosaukumam jābūt vismaz 3 rakstzīmes garam.');
  }

  // Simulēt datu bāzes mijiedarbību
  console.log('Veido vienumu:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simulēt latentumu

  console.log('Vienums veiksmīgi izveidots!');
}

export default function CreateItemForm() {
  const [isSubmitting, setIsSubmitting] = useState(false);
  const [errorMessage, setErrorMessage] = useState(null);
  
  async function handleSubmit(formData: FormData) {
    setIsSubmitting(true);
    setErrorMessage(null);
    try {
      await createItem(formData);
    } catch (error: any) {
      setErrorMessage(error.message || 'Notika kļūda.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Paskaidrojums:

Validācijas bibliotēku izmantošana

Sarežģītākiem validācijas scenārijiem apsveriet iespēju izmantot validācijas bibliotēkas, piemēram:

Šeit ir piemērs, izmantojot Zod:

// app/utils/validation.ts
import { z } from 'zod';

export const CreateItemSchema = z.object({
  name: z.string().min(3, 'Vienuma nosaukumam jābūt vismaz 3 rakstzīmes garam.'),
});
// app/components/CreateItemForm.tsx
'use client';

import { useState } from 'react';
import { CreateItemSchema } from '../utils/validation';

async function createItem(formData: FormData) {
  'use server'

  const name = formData.get('name') as string;

  const validatedFields = CreateItemSchema.safeParse({ name });

  if (!validatedFields.success) {
    return { errors: validatedFields.error.flatten().fieldErrors };
  }

  // Simulēt datu bāzes mijiedarbību
  console.log('Veido vienumu:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simulēt latentumu

  console.log('Vienums veiksmīgi izveidots!');
}

export default function CreateItemForm() {
  const [isSubmitting, setIsSubmitting] = useState(false);
  const [errorMessage, setErrorMessage] = useState(null);
  
  async function handleSubmit(formData: FormData) {
    setIsSubmitting(true);
    setErrorMessage(null);
    try {
      await createItem(formData);
    } catch (error: any) {
      setErrorMessage(error.message || 'Notika kļūda.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Paskaidrojums:

Drošības apsvērumi

Servera Darbības uzlabo drošību, izpildot kodu serverī, taču joprojām ir svarīgi ievērot drošības labākās prakses, lai aizsargātu jūsu lietotni no biežākajiem draudiem.

Starpvietņu pieprasījumu viltošanas (CSRF) novēršana

CSRF uzbrukumi izmanto uzticību, kāda tīmekļa vietnei ir lietotāja pārlūkprogrammā. Lai novērstu CSRF uzbrukumus, ieviest CSRF aizsardzības mehānismus.

Next.js automātiski nodrošina CSRF aizsardzību, izmantojot Servera Darbības. Ietvars ģenerē un validē CSRF marķieri (token) katrai formas iesniegšanai, nodrošinot, ka pieprasījums nāk no jūsu lietotnes.

Lietotāju autentifikācijas un autorizācijas apstrāde

Nodrošiniet, ka tikai autorizēti lietotāji var veikt noteiktas darbības. Ieviesiet autentifikācijas un autorizācijas mehānismus, lai aizsargātu sensitīvus datus un funkcionalitāti.

Šeit ir piemērs, izmantojot NextAuth.js, lai aizsargātu Servera Darbību:

// app/components/CreateItemForm.tsx
'use client';

import { useState } from 'react';
import { getServerSession } from 'next-auth';
import { authOptions } from '../../app/api/auth/[...nextauth]/route';

async function createItem(formData: FormData) {
  'use server'

  const session = await getServerSession(authOptions);

  if (!session) {
    throw new Error('Neautorizēts');
  }

  const name = formData.get('name') as string;

  // Simulēt datu bāzes mijiedarbību
  console.log('Veido vienumu:', name, 'lietotājs:', session.user?.email);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simulēt latentumu

  console.log('Vienums veiksmīgi izveidots!');
}

export default function CreateItemForm() {
  const [isSubmitting, setIsSubmitting] = useState(false);
  const [errorMessage, setErrorMessage] = useState(null);
  
  async function handleSubmit(formData: FormData) {
    setIsSubmitting(true);
    setErrorMessage(null);
    try {
      await createItem(formData);
    } catch (error: any) {
      setErrorMessage(error.message || 'Notika kļūda.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Paskaidrojums:

Ievades datu attīrīšana (Sanitizing)

Attīriet ievades datus, lai novērstu starpvietņu skriptēšanas (XSS) uzbrukumus. XSS uzbrukumi notiek, kad ļaunprātīgs kods tiek ievadīts tīmekļa vietnē, potenciāli apdraudot lietotāja datus vai lietotnes funkcionalitāti.

Izmantojiet bibliotēkas, piemēram, DOMPurify vai sanitize-html, lai attīrītu lietotāja sniegtos ievades datus, pirms tos apstrādājat savās Servera Darbībās.

Progresīvas tehnikas

Tagad, kad esam apskatījuši pamatus, izpētīsim dažas progresīvas tehnikas efektīvai Servera Darbību izmantošanai.

Optimistiskie atjauninājumi

Optimistiskie atjauninājumi nodrošina labāku lietotāja pieredzi, nekavējoties atjauninot lietotāja saskarni (UI) tā, it kā darbība būtu veiksmīga, pat pirms serveris to apstiprina. Ja darbība serverī neizdodas, UI tiek atgriezts iepriekšējā stāvoklī.

// app/components/UpdateItemForm.tsx
'use client';

import { useState } from 'react';

async function updateItem(id: string, formData: FormData) {
  'use server'

  const name = formData.get('name') as string;

  // Simulēt datu bāzes mijiedarbību
  console.log('Atjaunina vienumu:', id, 'ar nosaukumu:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simulēt latentumu

  // Simulēt neveiksmi (demonstrācijas nolūkos)
  const shouldFail = Math.random() < 0.5;
  if (shouldFail) {
    throw new Error('Neizdevās atjaunināt vienumu.');
  }

  console.log('Vienums veiksmīgi atjaunināts!');
  return { name }; // Atgriezt atjaunināto nosaukumu
}

export default function UpdateItemForm({ id, initialName }: { id: string; initialName: string }) {
  const [isSubmitting, setIsSubmitting] = useState(false);
  const [errorMessage, setErrorMessage] = useState(null);
  const [itemName, setItemName] = useState(initialName);

  async function handleSubmit(formData: FormData) {
    setIsSubmitting(true);
    setErrorMessage(null);

    // Optimistiski atjaunināt UI
    const newName = formData.get('name') as string;
    setItemName(newName);

    try {
      const result = await updateItem(id, formData);
      // Ja veiksmīgi, atjauninājums jau ir redzams UI, pateicoties setItemName

    } catch (error: any) {
      setErrorMessage(error.message || 'Notika kļūda.');
      // Kļūdas gadījumā atgriezt UI sākotnējā stāvoklī
      setItemName(initialName);
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    

Pašreizējais nosaukums: {itemName}

{errorMessage &&

{errorMessage}

}
); }

Paskaidrojums:

Datu atkārtota validēšana (Revalidating)

Pēc tam, kad Servera Darbība ir modificējusi datus, jums var būt nepieciešams atkārtoti validēt kešototus datus, lai nodrošinātu, ka UI atspoguļo jaunākās izmaiņas. Next.js nodrošina vairākus veidus, kā atkārtoti validēt datus:

Šeit ir piemērs ceļa atkārtotai validēšanai pēc jauna vienuma izveides:

// app/components/CreateItemForm.tsx
'use client';

import { useState } from 'react';
import { revalidatePath } from 'next/cache';

async function createItem(formData: FormData) {
  'use server'

  const name = formData.get('name') as string;

  // Simulēt datu bāzes mijiedarbību
  console.log('Veido vienumu:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simulēt latentumu

  console.log('Vienums veiksmīgi izveidots!');

  revalidatePath('/items'); // Atkārtoti validēt /items ceļu
}

export default function CreateItemForm() {
  const [isSubmitting, setIsSubmitting] = useState(false);
  const [errorMessage, setErrorMessage] = useState(null);
  
  async function handleSubmit(formData: FormData) {
    setIsSubmitting(true);
    setErrorMessage(null);
    try {
      await createItem(formData);
    } catch (error: any) {
      setErrorMessage(error.message || 'Notika kļūda.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Paskaidrojums:

Servera Darbību labākās prakses

Lai maksimāli izmantotu Servera Darbību priekšrocības, ievērojiet šādas labākās prakses:

Biežākās kļūdas un kā no tām izvairīties

Lai gan Servera Darbības piedāvā daudzas priekšrocības, ir dažas bieži sastopamas kļūdas, no kurām jāuzmanās:

Noslēgums

Next.js 14 Servera Darbības nodrošina jaudīgu un efektīvu veidu, kā apstrādāt formu iesniegšanu un datu mutācijas tieši serverī. Ievērojot šajā rokasgrāmatā izklāstītās labākās prakses, jūs varat veidot robustas, drošas un veiktspējīgas tīmekļa lietotnes. Izmantojiet Servera Darbības, lai vienkāršotu savu kodu, uzlabotu drošību un vispārējo lietotāja pieredzi. Integrējot šos principus, apsveriet savu izstrādes lēmumu globālo ietekmi. Pārliecinieties, ka jūsu formas un datu apstrādes procesi ir pieejami, droši un lietotājam draudzīgi dažādām starptautiskām auditorijām. Šī apņemšanās veicināt iekļautību ne tikai uzlabos jūsu lietotnes lietojamību, bet arī paplašinās tās sasniedzamību un efektivitāti globālā mērogā.